package controllers;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.List;

import play.db.DB;
import play.db.jpa.JPA;
import play.mvc.Controller;
import models.PontoEletronico;
import models.Tarefa;
import models.Usuario;
import controllers.negocioPontoEletronico.*;

public class Horarios extends Controller {

	private static Application ap = new Application();
	
	public static void registrarHorario() throws SQLException {

		ap.verificarAutenticacao();
		String tipoUsuario = ap.checkAdmin();
		String user = ap.usuario();
		ArrayList<PontoEletronico> pontoE = new ArrayList<PontoEletronico>();
		
	
		ResultSet rs = DB.executeQuery("exec horarioSemanal @usuario = "+ user );
		
		while(rs.next()){
			PontoEletronico p = new PontoEletronico(rs.getString("data"), 
					rs.getString("horaEntrada"), rs.getString("horaSaida"), 
							rs.getString("totalTrabalhado"));
			pontoE.add(p);
		}
		
		render(user, tipoUsuario, pontoE);
	}

	private static Usuario recuperarUsuarioLogado() {
		List<Usuario> usuarios = Usuario.findAll();
		String user = session.get("usuario");

		for (int i = 0; i < usuarios.size(); i++) {
			if (usuarios.get(i).getUsername().equals(user)) {
				Usuario p = Usuario.find("id", usuarios.get(i).getId()).first();
				return p;
			}
		}
		return null;
	}

	public static void registrarEntrada() throws SQLException {

		VerificarEntradasSaidas vf = new VerificarEntradasSaidas();

		String user = session.get("usuario");
		String data = (new java.text.SimpleDateFormat("dd/MM/yyyy HH:mm:ss")
				.format(new java.util.Date(System.currentTimeMillis())));

		String dataAtual = data.substring(0, 10);
		long id = vf.retornarIdPontoAberto(user);

		if (!vf.verificarEntradaEmAberto(user, id)) {

			if (vf.verificarQuantidadeEntradas(user, dataAtual) < 3) {
				if (recuperarUsuarioLogado() != null) {
					PontoEletronico p = new PontoEletronico(dataAtual,
							new SimpleDateFormat("HH:mm")
									.format(new java.util.Date()), "0", "0",
							true, recuperarUsuarioLogado());

					p.save();
					flash.success("Entrada realizada com sucesso!");
					registrarHorario();
				} 
			}else {
				flash.error("O numero de entradas no dia foi Excedido");
				registrarHorario();
			}
		} else {
			flash.error("Existe uma entrada em aberto");
		}
		registrarHorario();
	}

	public static void registrarSaida() throws SQLException {
		VerificarEntradasSaidas vf = new VerificarEntradasSaidas();
		String user = session.get("usuario");
		// Recupera Hora Atual

		String horaSaida = (new java.text.SimpleDateFormat("HH:mm")
				.format(new java.util.Date(System.currentTimeMillis())));

		long id = vf.retornarIdPontoAberto(user);

		if (vf.verificarEntradaEmAberto(user, id)) {

			PontoEletronico p = PontoEletronico.find("id", id).first();

			p.setHoraSaida(horaSaida);
			p.save();
			p.setTotalTrabalhado(calcularHorasTrabalhadas(p.getHoraEntrada(),
					p.getHoraSaida()));
			p.setPontoAberto(false);
			p.save();
			
			flash.success("Saida realizada com sucesso");

		} else {

			flash.error("Não existe Entrada em Aberto");

		}

		registrarHorario();
	}

	private static String calcularHorasTrabalhadas(String horaEntradaInfo,
			String horaSaidaInfo) {
		String diferenca = "", horaEntrada, horaSaida, minutoEntrada, minutoSaida;
		int horas = 0, minutos = 0;

		horaEntrada = horaEntradaInfo.substring(0, 2);
		horaSaida = horaSaidaInfo.substring(0, 2);
		minutoEntrada = horaEntradaInfo.substring(3, 5);
		minutoSaida = horaSaidaInfo.substring(3, 5);

		// minutos
		if (Integer.parseInt(minutoEntrada) > Integer.parseInt(minutoSaida)) {
			minutos = (60 - Integer.parseInt(minutoEntrada)) + Integer.parseInt(minutoSaida);
			horas = 1;
		}
		if (Integer.parseInt(minutoEntrada) <= Integer.parseInt(minutoSaida)) {
			minutos = Integer.parseInt(minutoSaida)
					- Integer.parseInt(minutoEntrada);
		}

		horas =  Integer.parseInt(horaSaida) - (Integer.parseInt(horaEntrada) + horas) ;
		System.out.println("hora: " + horas);
		if (horas >= 0 && horas < 10) {
			diferenca = "0" + horas + ":";
			System.out.println(diferenca +" uno");
		}
		if (horas > 9 && horas <=24) {
			diferenca = horas + ":";
			System.out.println(diferenca +" dos");
		}
		if (minutos >=0 && minutos < 10) {
			diferenca = diferenca + "0" + minutos;
			System.out.println(diferenca +" tres");
		}
		if (minutos > 9 && minutos <60) {
			diferenca = diferenca + minutos;
			System.out.println(diferenca +" quatro");
		}

		
		return diferenca;
	}
}
